import {
  Channel,
  UserChannelResponse,
  AllChannelsResponse,
  ArticlesResponse,
  Articles,
} from "@/types/data";
// 引入类型定义

import { RootThunkAction, RootState } from "@/types/store";
// 引入 Redux 相关类型定义

import { http } from "@/utils/http";
// 引入自定义的 HTTP 请求库

import { Toast } from "antd-mobile";
// 引入 Ant Design Mobile 的 Toast 组件

import { differenceBy } from "lodash";
// 引入 lodash 中的 differenceBy 函数，用于计算差集
const CHANNEL_KEY = "geek-channels";
// 定义本地存储的键名

// 获取用户频道的异步 action
export const getUserChannel = (): RootThunkAction => {
  return async (dispatch, getState) => {
    // 获取 Redux store 中的状态
    const state = getState() as RootState;
    const { token } = state.login;

    let UserChannel: Channel[] = [];
    // 初始化用户频道数组

    if (token) {
      // 如果用户已登录
      const res = await http.get<UserChannelResponse>("/user/channels");
      // 发送 HTTP 请求获取用户频道数据
      const { channels } = res.data.data;
      // 从响应中解构出频道数据
      UserChannel = channels;
      // 将获取到的用户频道赋值给 UserChannel
    } else {
      // 如果用户未登录
      const localChannels = JSON.parse(
        localStorage.getItem(CHANNEL_KEY) ?? "[]"
      ) as Channel[];
      // 从本地存储中获取用户频道数据，并转换为数组类型

      if (localChannels.length > 0) {
        // 如果本地存储中有用户频道数据
        console.log("未登录，本地有", localChannels);
        // 输出提示信息
        UserChannel = localChannels;
        // 将本地存储中的用户频道赋值给 UserChannel
      } else {
        // 如果本地存储中没有用户频道数据
        const res = await http.get<UserChannelResponse>("/user/channels");
        // 发送 HTTP 请求获取用户频道数据
        const { channels } = res.data.data;
        // 从响应中解构出频道数据
        localStorage.setItem(CHANNEL_KEY, JSON.stringify(channels));
        // 将获取到的频道数据存储到本地存储中
        console.log("未登录，本地没有", channels);
        // 输出提示信息
        UserChannel = channels;
        // 将获取到的用户频道赋值给 UserChannel
      }
    }
    // 将获取到的用户频道数据派发到 Redux store
    dispatch({ type: "home/getUserChannel", payload: UserChannel });
  };
};

// 获取所有频道的异步 action
export const getAllChannel = (): RootThunkAction => {
  return async (dispatch, getState) => {
    // 获取 Redux store 中的状态
    const res = await http.get<AllChannelsResponse>("/channels");
    // 发送 HTTP 请求获取所有频道数据
    const {
      home: { userChannel },
    } = getState();
    // 解构获取 Redux store 中的用户频道数据

    const restChannels = differenceBy(
      res.data.data.channels,
      userChannel,
      "id"
    );
    // 使用 lodash 中的 differenceBy 函数计算差集，得到剩余频道数据

    // 将剩余频道数据派发到 Redux store
    dispatch({ type: "home/getAllChannel", payload: restChannels });
  };
};

// 删除频道的异步 action
export const delChannel = (channel: Channel): RootThunkAction => {
  return async (dispatch, getState) => {
    // 获取 Redux store 中的状态
    const {
      login: { token },
    } = getState();

    if (token) {
      // 如果用户已登录
      await http.delete(`/user/channels/${channel.id}`);
      // 发送 HTTP 请求删除频道
      Toast.show({
        content: "成功删除频道！",
      });
      // 弹出删除成功的提示
      dispatch({ type: "home/delChannel", payload: channel });
      // 将删除的频道派发到 Redux store
    } else {
      // 如果用户未登录
      const localChannels = JSON.parse(
        localStorage.getItem(CHANNEL_KEY) ?? "[]"
      ) as Channel[];
      // 从本地存储中获取用户频道数据，并转换为数组类型

      const userChannel = localChannels.filter(
        (item) => item.id !== channel.id
      );
      // 过滤掉要删除的频道

      localStorage.setItem(CHANNEL_KEY, JSON.stringify(userChannel));
      // 更新本地存储中的用户频道数据
    }
  };
};

// 添加频道的异步 action
export const addChannel = (
  channel: Channel,
  seq: number,
  id: number
): RootThunkAction => {
  return async (dispatch, getState) => {
    // 输出添加的频道信息
    const {
      login: { token },
    } = getState();
    // 获取 Redux store 中的状态，提取用户登录状态
    let body = { channels: [{ id, seq }] };
    if (token) {
      // 如果用户已登录
      await http.patch("/user/channels", body);
      // 发送 HTTP 请求添加频道
    } else {
      // 如果用户未登录
      const localChannels = JSON.parse(
        localStorage.getItem(CHANNEL_KEY) ?? "[]"
      ) as Channel[];
      // 从本地存储中获取用户频道数据，并转换为数组类型
      const userChannel = [...localChannels, channel];
      // 将要添加的频道加入用户频道数组
      localStorage.setItem(CHANNEL_KEY, JSON.stringify(userChannel));
      // 更新本地存储中的用户频道数据
    }
    // 将添加的频道派发到 Redux store
    dispatch({ type: "home/addChannel", payload: channel });
  };
};
// 获取文章列表
export const getArticleList = (
  channel_id: number,
  timestamp: string
): RootThunkAction => {
  return async (dispatch) => {
    const res = await http.get<ArticlesResponse>("/articles", {
      params: {
        channel_id,
        timestamp,
      },
    });
    // 分发 action
    dispatch({
      type: "home/getChannelArticles",
      payload: {
        channelId: channel_id,
        data: res.data.data,
      },
    });
  };
};
